﻿// 友元函数
#include<iostream>
using namespace std;
class B;// 前置声明，防止A中友元函数声明时，编译器不认识B

class A
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _a1 = 5;
};
class B
{
	// 友元声明
	friend void func(const A& aa, const B& bb);
private:
	int _b1 = 3;
};

void func(const A& aa, const B& bb)
{
	cout << aa._a1 << endl;
	cout << bb._b1 << endl;
}

int main()
{
	A aa;
	B bb;
	func(aa, bb);
	return 0;
}


////友元类
//#include<iostream>
//using namespace std;
//class A
//{
//	friend class B;// 友元类声明
//private:
//	int _a1 = 1;
//	int _a2 = 2;
//};
//class B
//{
//public:
//	void func1(const A& aa)
//	{
//		cout << aa._a1 << endl;
//		cout << _b1 << endl;
//	}
//	void func2(const A& aa)
//	{
//		cout << aa._a2 << endl;
//		cout << _b2 << endl;
//	}
//private:
//	int _b1 = 3;
//	int _b2 = 4;
//};
//
//int main()
//{
//	A aa;
//	B bb;
//	bb.func1(aa);
//	bb.func2(aa);
//	return 0;
//}
//
//
//// 实现⼀个类，计算程序中创建出了多少个类对象？
//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	A()
//	{
//		++_scount;// 非静态的成员函数，可以访问任意的静态成员变量和静态成员函数
//	}
//	static int GetACount()
//	{
//		return _scount;
//	}
//private:
//	static int _scount;
//};
//int A::_scount = 0;
//
//int main()
//{
//	cout << A::GetACount() << endl;
//	A a1;
//	cout << a1.GetACount() << endl;
//	A a2, a3;
//	cout << a2.GetACount() << endl;
//	return 0;
//}
//
//
//// 内部类
//#include<iostream>
//using namespace std;
//class A
//{
//private:
//	static int _k;
//	int _h = 5;
//
//public:
//	class B // 内部类默认是外部类的友元类，所以B默认就是A的友元
//	{       
//	public:
//		void fun(const A& a)
//		{
//			cout << _k << endl; 
//			cout << a._h << endl; 
//			cout << _b << endl;
//		}
//	private:
//		int _b = 1;
//	};
//};
//int A::_k = 10;
//
//int main()
//{
//	A a;
//	// A类对象大小大小为4，所以外部类定义的对象中不包含内部类
//	cout << "A类对象大小:" << sizeof(a) << endl;
//	// 内部类受到外部类的类域和访问限定符限制，定义内部类对象要指定类域
//	A::B b;
//	b.fun(a);
//	return 0;
//}